/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package view;
import java.awt.Graphics;
import java.awt.Point;
import controller.Controller;
import java.awt.Color;

/**
 * Az Element-nek megfelelő osztály a grafikus megjelenítésben.
 * @author taplo
 */
public abstract class VisualElement {
    /**
     * Az alkatrész magassága (kattintás szempontjából is fontos)
     */
    protected int height;
    /**
     * Az alkatrész szélessége (kattintás szempontjából is fontos)
     */
    protected int width;
    /**
     * Az alkatrész helye - bal felső sarka - a rajzvászonon
     */
    protected Point pos;
    /**
     * A bemenetek száma
     */
    protected int inputs;
    /**
     * A kimenetek száma
     */
    protected int outputs;
    /**
     * Az alkatrész azonsítója. Ennek segítségével tud lekérni állapotot a modelből
     */
    protected int ID;
    /**
     * Az alkatrész neve
     */
    protected String name;
    /**
     * Referencia a controllerre, amin keresztül eléri a modellt
     */
    protected static Controller controller;

    /**
     * Konstruktor, létrehozza a VisualElement objektumot.
     * @param id A megfelelő modell-beli elem ID-ja.
     * @param pos Az elem pozíciója a rajzvásznon.
     * @param name Az elem típusa.
     * @param in A bemenetek száma.
     * @param out A kimenetek száma.
     */
    VisualElement(int id, Point pos, String name, int in, int out){
        ID = id;
        this.pos = pos;
        inputs = in;
        outputs = out;
        width = 60;
        this.name = name;
        //A téglalap magassága attól függ hány bemenet/kimenet van, de minimum 40 magas
        height = in > out? ((in + 1) * 5 > 40 ? (in + 1) * 5 : 40): ((out + 1) * 5 > 40 ? (out + 1) * 5 : 40) ;
    }

    /**
     * Kirajzoló metódus. Ez a függvény általános kapu kirajzoló metódus, az
     * osztály változói alapján megrajzol egy téglalapot, és annyi lelógó lábat
     * ahány ki- és bemenete van.
     * @param g Erre a Graphicsra rajzolunk
     */
    public void draw(Graphics g){
        g.setColor(Color.black);
        //Téglalap kirajzolása
        g.drawRect(pos.x, pos.y, width, height);
        //A vezetékek lábainak kirajzolása
        for (int i = 1; i <= inputs; i++){
            g.drawLine(pos.x-5, pos.y+height/(inputs+1)*i,pos.x,pos.y+height/(inputs+1)*i);
        }
        for (int i = 1; i <= outputs; i++){
            g.drawLine(pos.x+width+5, pos.y+height/(outputs+1)*i,pos.x+width,pos.y+height/(outputs+1)*i);
        }
    }

    /**
     * Adott sorszámú vezeték lábának csatlakozási pontját lekérő metódus.
     * @param in A bemeneti vezetk sorszáma, aminek a csatlakozási pontját akarjuk
     * @return A csatlakozási pont koordinátái
     */
    public Point getInputPos(int in){
        return new Point(pos.x - 5,pos.y + height /(inputs + 1) * (in + 1));
    }

    /**
     * Adott sorszámú vezeték lábának csatlakozási pontját lekérő metódus.
     * @param out A kimeneti vezeték sorszáma, aminek a csatlakozási pontját akarjuk
     * @return A csatlakozási pont koordinátái
     */
    public Point getOutputPos(int out){
        return new Point(pos.x + width + 5,pos.y + height /(outputs + 1) * (out + 1));
    }

    /**
     * Ezzel a metódussal állítjuk be a controllert, amin keresztül az egyes
     * elemek lekérhetik a modell állapotát, hogy e szerint rajzolják ki magukat.
     * @param c
     */
    public static void setController(Controller c){
        controller = c;
    }
}
